package lanQiaoBei.搜索与图论.最短路.bellman_ford;

import java.io.*;
import java.util.*;
import java.math.*;

/*Bellman_ford算法适用于可以存在负权边且最多经过k条边的最短距离
题目描述
定一个n个点m条边的有向图，图中可能存在重边和自环， 边权可能为负数。

请你求出从1号点到n号点的最多经过k条边的最短距离，如果无法从1号点走到n号点，输出impossible。

注意：图中可能 存在负权回路 。

输入格式
第一行包含三个整数n，m，k。

接下来m行，每行包含三个整数x，y，z，表示点x和点y之间存在一条有向边，边长为z。

输出格式
输出一个整数，表示从1号点到n号点的最多经过k条边的最短距离。

如果不存在满足条件的路径，则输出“impossible”。

数据范围
1≤n,k≤500,
1≤m≤10000,
任意边长的绝对值不超过10000。

样例
输入样例：
3 3 1
1 2 1
2 3 1
1 3 3
输出样例：
3
* */
public class P1 {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    final static int N = 10010;
    static int ds[] = new int[N], backup[] = new int[N], n, m, k;

    static class Edge {
        int a, b, w;

        public Edge(int a, int b, int w) {
            this.a = a;
            this.b = b;
            this.w = w;
        }
    }

    static Edge[] edges = new Edge[N];

    static int bellman_fold() {
        Arrays.fill(ds, 0x7f7f7f7f);
        ds[1] = 0;
        for (int i = 0; i < k; i++) {
            System.arraycopy(ds, 1, backup, 1, n);
            for (int j = 0; j < m; j++) {
                int a = edges[j].a, b = edges[j].b, w = edges[j].w;
                ds[b] = Math.min(ds[b], backup[a] + w);
            }
        }
        if (ds[n] >= 0x7f7f7f7f / 2) return -1;
        else return ds[n];
    }

    public static void main(String[] ss) throws IOException {
        ss = br.readLine().split(" ");
        n = Integer.parseInt(ss[0]);
        m = Integer.parseInt(ss[1]);
        k = Integer.parseInt(ss[2]);
        for (int i = 0; i < m; i++) {
            ss = br.readLine().split(" ");
            int a = Integer.parseInt(ss[0]), b = Integer.parseInt(ss[1]), w = Integer.parseInt(ss[2]);
            edges[i] = new Edge(a, b, w);
        }
        System.out.print(bellman_fold());
    }
}
